iOS开发CoreGraphics核心图形框架之三——颜色与色彩空间
一、引言
颜色的实质是表示颜色的二进制数据,如果没有确定的规则,则这些二进制数据完全没有意义。所谓色彩空间,即是表示这些颜色数据信息是如何解释的。同样的一张图片,在不同的色彩空间下,其渲染的模样将有很大的不同。在CoreGraphics框架中,与色彩相关的功能主要有CGColor与CGColorSpace构成。
二、关于CGColor相关方法的解析
CGColorRef是CoreGraphics框架中用于描述颜色的引用类型,其中常用方法解析如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
   | 
 
 
 
  CGColorRef __nullable CGColorCreate(CGColorSpaceRef cg_nullable space, const CGFloat * cg_nullable components);
 
 
 
 
 
  CGColorRef  CGColorCreateGenericGray(CGFloat gray, CGFloat alpha);
  CGColorRef  CGColorCreateGenericRGB(CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha);
  CGColorCreateGenericCMYK(CGFloat cyan, CGFloat magenta, CGFloat yellow, CGFloat black, CGFloat alpha);
 
 
 
 
 
 
 
 
 
  CGColorRef __nullable CGColorGetConstantColor(CFStringRef cg_nullable colorName);
  CGColorRef __nullable CGColorCreateWithPattern(CGColorSpaceRef cg_nullable space, CGPatternRef cg_nullable pattern, const CGFloat * cg_nullable components);
  CGColorRef __nullable CGColorCreateCopy(CGColorRef cg_nullable color);
  CGColorRef __nullable CGColorCreateCopyWithAlpha(CGColorRef cg_nullable color, CGFloat alpha);
 
 
 
 
 
 
 
 
 
 
  CGColorRef __nullable CGColorCreateCopyByMatchingToColorSpace(cg_nullable CGColorSpaceRef, CGColorRenderingIntent intent, CGColorRef cg_nullable color, __nullable CFDictionaryRef options);
  CGColorRef cg_nullable CGColorRetain(CGColorRef cg_nullable color);
  void CGColorRelease(CGColorRef cg_nullable color);
  bool CGColorEqualToColor(CGColorRef cg_nullable color1, CGColorRef cg_nullable color2);
  size_t CGColorGetNumberOfComponents(CGColorRef cg_nullable color);
  CGFloat * __nullable CGColorGetComponents(CGColorRef cg_nullable color);
  CGFloat CGColorGetAlpha(CGColorRef cg_nullable color);
  CGColorSpaceRef __nullable CGColorGetColorSpace(CGColorRef cg_nullable color);
  CGPatternRef __nullable CGColorGetPattern(CGColorRef cg_nullable color);
  CFTypeID CGColorGetTypeID(void);
 
  | 
 
三、关于CGColorSpace相关方法解析
CGColorSpace用来描述色彩空间,其中方法解析如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
   |  CGColorSpaceRef cg_nullable CGColorSpaceCreateDeviceGray(void);
  CGColorSpaceRef cg_nullable CGColorSpaceCreateDeviceRGB(void);
  CGColorSpaceRef cg_nullable CGColorSpaceCreateDeviceCMYK(void);
  CGColorSpaceRef __nullable CGColorSpaceCreateCalibratedGray(const CGFloat whitePoint[3], const CGFloat blackPoint[3], CGFloat gamma);
  CGColorSpaceRef __nullable CGColorSpaceCreateCalibratedRGB(const CGFloat whitePoint[3], const CGFloat blackPoint[3], const CGFloat gamma[3], const CGFloat matrix[9]);
  CGColorSpaceRef __nullable CGColorSpaceCreateLab(const CGFloat whitePoint[3], const CGFloat blackPoint[3], const CGFloat range[4]);
  CGColorSpaceRef __nullable CGColorSpaceCreateWithICCProfile(CFDataRef cg_nullable data); CGColorSpaceRef __nullable CGColorSpaceCreateICCBased(size_t nComponents, const CGFloat * __nullable range, CGDataProviderRef cg_nullable profile, CGColorSpaceRef __nullable alternate);
  CGColorSpaceRef __nullable CGColorSpaceCreateIndexed(CGColorSpaceRef cg_nullable baseSpace, size_t lastIndex, const unsigned char * cg_nullable colorTable);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  CGColorSpaceRef __nullable CGColorSpaceCreateWithName(CFStringRef cg_nullable name);
  CGColorSpaceRef cg_nullable CGColorSpaceRetain(CGColorSpaceRef cg_nullable space);
  void CGColorSpaceRelease(CGColorSpaceRef cg_nullable space);
  CFStringRef __nullable CGColorSpaceCopyName(CGColorSpaceRef cg_nullable space);
  CFTypeID CGColorSpaceGetTypeID(void);
  CGColorSpaceGetNumberOfComponents(CGColorSpaceRef cg_nullable space);
 
 
 
 
 
 
 
 
 
 
 
 
 
  CGColorSpaceModel CGColorSpaceGetModel(CGColorSpaceRef cg_nullable space);
 
  | 
 
相同的图像,使用不同的色彩空间进行渲染,得到的结果可能大不一样,例如如下代码修改图片的色彩空间:
1 2 3 4 5 6 7 8 9 10 11
   | - (void)viewDidLoad {     [super viewDidLoad];     CGImageRef image = CGImageCreateCopyWithColorSpace([UIImage imageNamed:@"image"].CGImage, CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB));     CGImageRef image2 = CGImageCreateCopyWithColorSpace([UIImage imageNamed:@"image"].CGImage, CGColorSpaceCreateWithName(kCGColorSpaceROMMRGB));     UIImageView * imageView = [[UIImageView alloc]initWithImage:[UIImage imageWithCGImage:image]];     UIImageView * imageView2 = [[UIImageView alloc]initWithImage:[UIImage imageWithCGImage:image2]];     imageView.frame = CGRectMake(100, 100, 200, 200);     imageView2.frame = CGRectMake(100, 300, 200, 200);     [self.view addSubview:imageView];     [self.view addSubview:imageView2]; }
  | 
 
效果如下:
原图如下:

模拟器运行如下:

专注技术,热爱生活,交流技术,也做朋友。
——珲少 QQ群:203317592